package com.atguigu.tingshu.user.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.common.util.MongoUtil;
import com.atguigu.tingshu.model.user.UserListenProcess;
import com.atguigu.tingshu.user.service.UserListenProcessService;
import com.atguigu.tingshu.vo.album.TrackStatMqVo;
import com.atguigu.tingshu.vo.user.UserListenProcessVo;
import io.swagger.v3.core.util.Json;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * 用户收听进度服务实现类
 */
@Service
@SuppressWarnings({"all"})
public class UserListenProcessServiceImpl implements UserListenProcessService {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private RabbitService rabbitService;

    /**
     * 获取用户最近收听的节目信息
     * @param userId 用户ID
     * @return 包含最近收听节目ID和专辑ID的Map
     */
    @Override
    /**
     * 获取用户最近的听歌记录
     * 
     * @param userId 用户ID，用于查询最近的听歌记录
     * @return 返回一个包含最近听的歌曲ID和专辑ID的Map对象
     */
    public Map<String, Object> getLatelyTrack(Long userId) {
        // 创建一个HashMap用于存储查询结果
        HashMap<String, Object> map = new HashMap<>();
        // 获取用户听歌记录的集合名称
        String collectionName = this.getCollectionName(userId);
        // 创建查询对象，并指定排序和限制条件，以便获取最新的听歌记录
        Query query = new Query();
        query.with(Sort.by(Sort.Direction.DESC,"updateTime")).limit(1);
        // 执行查询，获取最新的听歌记录列表
        List<UserListenProcess> userListenProcessList = this.mongoTemplate.find(query, UserListenProcess.class, collectionName);
        // 执行查询，获取最新的听歌记录单个对象
        UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, collectionName);
        // 打印最新的听歌记录的歌曲ID和专辑ID
        System.out.println((userListenProcess.getTrackId() + ":\t" + userListenProcess.getAlbumId()));
        // 将最新的听歌记录的歌曲ID和专辑ID存入Map对象中
        map.put("trackId",userListenProcessList.get(0).getTrackId());
        map.put("albumId",userListenProcessList.get(0).getAlbumId());
        // 返回包含最新听歌记录信息的Map对象
        return map;
    }

    /**
     * 更新用户收听进度
     * @param userListenProcessVo 用户收听进度VO对象
     * @param userId 用户ID
     */
    @Override
    public void updateListenProcess(UserListenProcessVo userListenProcessVo, Long userId) {
        Query query = Query.query(Criteria.where("trackId").is(userListenProcessVo.getTrackId()));
        String collectionName = this.getCollectionName(userId);

        UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, collectionName);
        if (null!=userListenProcess){
            userListenProcess.setUpdateTime(new Date());
            userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());

        }else {
            userListenProcess = new UserListenProcess();
            BeanUtils.copyProperties(userListenProcessVo,userListenProcess);
            userListenProcess.setUserId(userId);
            userListenProcess.setCreateTime(new Date());
            userListenProcess.setUpdateTime(new Date());
        }
        mongoTemplate.save(userListenProcess,collectionName);

        String key = "track:play:stat:"+userId+":"+userListenProcessVo.getTrackId();

        Boolean result = this.redisTemplate.opsForValue().setIfAbsent(key, "1", 1, TimeUnit.DAYS);

//        List values = redisTemplate.opsForHash().values(key);


        if (result){
            TrackStatMqVo trackStatMqVo = new TrackStatMqVo();
            trackStatMqVo.setTrackId(userListenProcessVo.getTrackId());
            trackStatMqVo.setAlbumId(userListenProcessVo.getAlbumId());
            trackStatMqVo.setStatType(SystemConstant.TRACK_STAT_PLAY);
            trackStatMqVo.setCount(1);
            String businessNo = UUID.randomUUID().toString().replaceAll("-", "");
            trackStatMqVo.setBusinessNo(businessNo);

            this.rabbitService.sendMessage(MqConst.EXCHANGE_TRACK,MqConst.ROUTING_TRACK_STAT_UPDATE, JSON.toJSONString(trackStatMqVo));
        }
    }

    /**
     * 获取用户在特定节目中的断点续播秒数
     * @param trackId 节目ID
     * @param userId 用户ID
     * @return 断点续播秒数，如果不存在则返回0
     */
    @Override
    public BigDecimal getTrackBreakSecond(Long trackId,Long userId) {

        Query query = Query.query(Criteria.where("trackId").is(trackId));
        String collectionName = this.getCollectionName(userId);
        UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, collectionName);

        if (null!=userListenProcess){
            return userListenProcess.getBreakSecond();
        }

        return new BigDecimal("0");
    }

    /**
     * 根据用户ID获取MongoDB集合名称
     * @param userId 用户ID
     * @return 对应的MongoDB集合名称
     */
    private String getCollectionName(Long userId) {
        String collectionName = MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId);
        return collectionName;
    }
}
